package com.luobr.backend.manage.upload;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpStatus;
import cn.hutool.http.HttpUtil;
import cn.hutool.http.Method;
import com.luobr.backend.common.ResponseCode;
import com.luobr.backend.constant.ImageConstant;
import com.luobr.backend.exception.BusinessException;
import com.luobr.backend.exception.ThrowUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * @author: 罗念笙
 * @date: 2025/3/2 15:12
 */
@Slf4j
@Service
public class UploadAndParseImageByUrl extends UploadAndParseImageTemplate {
    @Override
    public void validImage(Object inputSource) {
        String fileUrl = (String) inputSource;
        // 校验文件地址是否为空
        ThrowUtils.throwIf(StrUtil.isBlank(fileUrl), ResponseCode.PARAMS_ERROR, "文件 URL 不能为空！");
        // 校验 URL 格式是否正确
        boolean result = false;
        for (String prefixFormat : ImageConstant.ALLOW_UPLOAD_URL_PREFIX_FORMAT_LIST) {
            if (fileUrl.startsWith(prefixFormat)) {
                result = true;
                break;
            }
        }
        // 处理图片上传地址，防止出现转义问题
        int questionMarkIndex = fileUrl.indexOf("?");
        if (questionMarkIndex > -1) {
            fileUrl = fileUrl.substring(0, questionMarkIndex);
        }
        ThrowUtils.throwIf(!result, ResponseCode.PARAMS_ERROR, "文件 URL 前缀格式错误！");
        try {
            new URL(fileUrl);
        } catch (MalformedURLException e) {
            throw new BusinessException(ResponseCode.PARAMS_ERROR, "文件 URL 格式错误！");
        }
        // 发送 HEAD请求 以验证文件是否存在
        HttpResponse response = null;
        try {
            // 发出 head 请求来获取图片信息
            response = HttpUtil.createRequest(Method.HEAD, fileUrl).execute();
            // 没有返回成功，可能是图片服务方并没有提供head请求的接收，不用做处理，返回即可
            if (response.getStatus() != HttpStatus.HTTP_OK) {
                return;
            }
            // 校验文件的类型
            String contentType = response.header("Content-Type");
            ThrowUtils.throwIf(StrUtil.isNotBlank(contentType) && !ImageConstant.ALLOW_IMAGE_TYPES_LIST.contains(contentType),
                    ResponseCode.PARAMS_ERROR, "文件类型错误！");
            // 校验文件大小
            String contentLength = response.header("Content-Length");
            ThrowUtils.throwIf(Long.parseLong(contentLength) > ImageConstant.FILE_SIZE_LIMIT, ResponseCode.PARAMS_ERROR, "文件大小不能超过 2M");
        } finally {
            if(ObjUtil.isNotNull(response)) {
                response.close();
            }
        }

    }

    @Override
    public String getOriginalFilename(Object inputSource) {
        String fileUrl = (String) inputSource;
        return FileUtil.mainName(fileUrl);
    }

    @Override
    public void processFile(Object inputSource, File file) {
        String fileUrl = (String) inputSource;
        HttpUtil.downloadFile(fileUrl,file);
    }
}
